package com.cskaoyan.abstracts;

/*
      抽象类的成员
         a 成员变量： 和普通类中定义成员变量，没有任何区别
         b 构造方法:  和普通类中定义构造方法，没有区别
         c 成员方法:
            a. 抽象方法： 在声明有这样的行为，但是不知道行为如何实现
            b. 普通方法： 是想基于继承，让子类复用抽象父类中的代码

      抽象类不能实例化，为啥有构造方法？
      1. 因为抽象类中，可以像普通类一样，定义成员变量，而这些成员变量，在创建子类对象的时候，也是初始化
      2. 在子类对象中，抽象父类中定义的成员，它们值的初始化，交给抽象父类的构造方法来完成(各司其职)



 */
public class Demo3Component {
}

abstract class ComponentFather {
    // 成员变量
    int a;

    // 构造方法
    public ComponentFather(int a) {
        this.a = a;
    }

    // 抽象方法
    public abstract void abstractTest();

    // 普通方法
    public void test() {
        System.out.println("test");
    }
}

class ComponentSon extends ComponentFather {

    int sonI;

    /*
        对于子类对象仍然要保证子类对象的初始化流程
     */
    public ComponentSon(int sonI, int a) {
        super(a);
        this.sonI = sonI;
    }

    @Override
    public void abstractTest() {
        System.out.println("....");
    }
}
